package main

import "fmt"

// 结构体中值接收者和指针接受者的区别
// 结构体值类型接收者实例化后的结构体值类型和结构体指针类型都可以赋值给接口变量
// 结构体指针类型接受者实例化后只有结构体指针类型可以赋值给接口变量

// 一个结构体实现多个接口

// Animaler Animaler中定义两个方法，分别是SetName和GetName
type Animaler interface {
	SetName(string)
	GetName() string
}

// Animaler1 只定义GetName
type Animaler1 interface {
	GetName() string
}

// Animaler2 只定义SetName
type Animaler2 interface {
	SetName(string)
}

// Dog 结构体
type Dog struct {
	Name string
}

// SetName 修改结构体中的Name属性
func (d *Dog) SetName(name string) {
	d.Name = name
}

// GetName 获取结构体中的Name属性
func (d Dog) GetName() string {
	return d.Name
}

// Cat 结构体
type Cat struct {
	Name string
}

// SetName 修改结构体中的Name属性
func (c *Cat) SetName(name string) {
	c.Name = name
}

// GetName 获取结构体中的Name属性
func (c Cat) GetName() string {
	return c.Name
}

func main() {
	// // Dog实现Animaler的接口
	// d := Dog{
	// 	Name: "小红",
	// }
	// var d1 Animaler1 = &d
	// fmt.Println(d1.GetName())
	// // d1.SetName("小红红")
	// fmt.Println(d1.GetName())

	// // Cat实现Animaler的接口
	// c := Cat{
	// 	Name: "小黑",
	// }
	// var c1 Animaler = c
	// fmt.Println(c1.GetName())
	// c1.SetName("小嘿嘿")
	// fmt.Println(c1.GetName())

	// 一个结构体实现多个接口
	d := Dog{
		Name: "小红",
	}
	var d1 Animaler1 = d
	var d2 Animaler2 = &d
	fmt.Println(d1.GetName())
	d2.SetName("大红")
	fmt.Println(d1.GetName())
}
